'use strict'

import {
    app,
    protocol,
    BrowserWindow,
    Menu,
    globalShortcut
} from 'electron'

import {
    createProtocol,
    /* installVueDevtools */
} from 'vue-cli-plugin-electron-builder/lib'
const isDevelopment = process.env.NODE_ENV !== 'production'
const autoUpdater = require("electron-updater").autoUpdater // APP更新
const path = require('path')
const url = require('url')
//保留该窗口对象的全局引用，否则，该窗口将
//当JavaScript对象被垃圾回收时，将自动关闭。
let win

//必须先注册方案，然后才能准备好应用程序
protocol.registerSchemesAsPrivileged([{
    scheme: 'app',
    privileges: {
        secure: true,
        standard: true
    }
}])



function createWindow() {
    //创建浏览器窗口。
    win = new BrowserWindow({
        width: 1200,
        height: 800,
        minWidth: 850,
        minHeight: 640,
        webPreferences: {
            webSecurity: false,
            nodeIntegration: true
        },
        // eslint-disable-next-line no-undef
        icon: `${__static}/app.ico`
    })
    // and load the index.html of the app.
    win.loadURL(url.format({
        pathname: path.join(__dirname, 'index.html'),
        protocol: 'file:',
        slashes: true
    }))

    win.on('closed', () => {
        win = null
    })

    createMenu()

    if (process.env.WEBPACK_DEV_SERVER_URL) {
        //如果处于开发模式，请加载开发服务器的网址
        win.loadURL(process.env.WEBPACK_DEV_SERVER_URL)
        if (!process.env.IS_TEST) win.webContents.openDevTools()
    } else {
        createProtocol('app')
        //不在开发中时加载index.html
        win.loadURL('app://./index.html')
    }

    win.on('closed', () => {
        win = null
    })
    // APP 更新
    autoUpdater.setFeedURL('http://m.tsinglen.cn/app')
    autoUpdater.checkForUpdates()
    autoUpdater.on('update-downloaded', function () {
        autoUpdater.quitAndInstall() //关闭软件并安装新版本
    })
}

// 设置菜单栏
function createMenu() {
    // darwin表示macOS，针对macOS的设置
    if (process.platform === 'darwin') {
        const template = [{
            label: 'App Demo',
            submenu: [{
                    role: 'about'
                },
                {
                    role: 'quit'
                }
            ]
        }]
        let menu = Menu.buildFromTemplate(template)
        Menu.setApplicationMenu(menu)
    } else {
        // windows及linux系统
        Menu.setApplicationMenu(null)
    }
}

//关闭所有窗口后退出。
app.on('window-all-closed', () => {
    //在macOS上，应用程序及其菜单栏很常见
    //保持活动状态，直到用户使用Cmd + Q明确退出为止
    if (process.platform !== 'darwin') {
        app.quit()
    }
})

app.on('activate', () => {
    //在macOS上，通常会在应用程序重新创建窗口时
    //单击停靠图标，没有其他窗口打开。
    if (win === null) {
        createWindow()
    }
})

//当Electron完成时将调用此方法
//初始化并准备创建浏览器窗口。
//有些API仅在此事件发生后才能使用。
app.on('ready', async () => {
    if (isDevelopment && !process.env.IS_TEST) {
        //安装Vue Devtools
        // Devtools扩展在Electron 6.0.0及更高版本中被破坏
        //有关更多信息，请参见https://github.com/nklayman/vue-cli-plugin-electron-builder/issues/378
        // Electron不会以暗模式在Windows 10上安装的Devtools扩展名下启动
        //如果您未使用Windows 10暗模式，则可以取消注释以下行
        //此外，如果链接的问题已关闭，则可以升级电子并取消注释这些行
        //尝试 {
        //   await installVueDevtools()
        // } catch (e) {
        //   console.error('Vue Devtools failed to install:', e.toString())
        // }

    }
    if (isDevelopment && !process.env.IS_TEST) {
        //安装Vue Devtools
        try {
            await installVueDevtools()
        } catch (e) {
            console.error('Vue Devtools failed to install:', e.toString())
        }
    }
    // 在开发环境和生产环境均可通过快捷键打开devTools
    globalShortcut.register('CommandOrControl+Shift+d', function () {
        win.webContents.openDevTools()
    })
    createWindow()
})

//在开发模式下应要求清空父进程。
if (isDevelopment) {
    if (process.platform === 'win32') {
        process.on('message', data => {
            if (data === 'graceful-exit') {
                app.quit()
            }
        })
    } else {
        process.on('SIGTERM', () => {
            app.quit()
        })
    }
}